package Json;

import com.google.gson.Gson;
import org.apache.log4j.Logger;

/**
 * @author Ajie
 * @date 2023/3/9
 * @function
 *
 * 结论。GSON
 * 1.只会解析匹配的field。
 * 2.不匹配的字段，不会解析。向后兼容 可以。不会报错。 类没有 addr field。String 有 "addr":"南天门"
 * 3.field. 有无双引号都可以。 字符串 "age":18 或者 "age":"18" 都可以。
 * 4.field 对应 String 【类型错误】。【Exception】 字符串 "age":"age18" 不可以！！！
 *
 * Json向后兼容:main:oldP:Person{name='张三丰', age='null'}
 * Json向后兼容:main:nowP:Person{name='张三丰', age='18'}
 * Json向后兼容:main:newP:Person{name='张三丰', age='18'}//字符串， addr 没显示。忽略了不匹配的字段。
 * Json向后兼容:main:newP:Person{name='张三丰', age='18'}//字符串， addr 没显示。忽略了不匹配的字段。 jsonArray。也忽略了。
 *
 */
public class JsonGson向后兼容 {
private static final Logger logger = Logger.getLogger(JsonGson向后兼容.class);

    public static void main(String[] args) {
        String oldStr = "{\"name\":\"张三丰\"}";
        System.out.println("Json向后兼容:main:oldP:"+new Gson().fromJson(oldStr, Person.class).toString());
        //{name='张三丰', age='null'}


        String nowStr = "{\"name\":\"张三丰\",\"age\":18}";
        System.out.println("Json向后兼容:main:nowP:"+new Gson().fromJson(nowStr, Person.class).toString());


        String newStr = "{\"name\":\"张三丰\",\"age\":18,\"addr\":\"南天门\"}";
        System.out.println("Json向后兼容:main:newP2:"+new Gson().fromJson(newStr, Person.class).toString());

        String newStr2 =
                "{\n" +
                "    \"name\":\"张三丰\",\n" +
                "    \"age\":18,\n" +
                "    \"addr\":\"南天门\",\n" +
                "    \"jsonArray\":[\n" +
                "        {\n" +
                "            \"k1\":\"v1\"\n" +
                "        }\n" +
                "    ]\n" +
                "}";
        System.out.println("Json向后兼容:main:newP:"+new Gson().fromJson(newStr2, Person.class).toString());


        String wrongFieldType = "{\"name\":\"张三丰\",\"age\":\"18\"}";
        System.out.println("Json向后兼容:main:wrongFieldType:"+new Gson().fromJson(wrongFieldType, Person.class).toString());

        String wrongFieldType2 = "{\"name\":\"张三丰\",\"age\":\"age18\"}";
        System.out.println("Json向后兼容:main:wrongFieldType2:"+new Gson().fromJson(wrongFieldType2, Person.class).toString());


    }


    static class Person{
        public String name;
        public int age;

        @Override
        public String toString() {
            return "Person{" +
                    "name='" + name + '\'' +
                    ", age='" + age + '\'' +
                    '}';
        }
    }
}
